package com.xncoding.pos.async;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * AsyncExceptionHandler
 *
 * @author XiongNeng
 * @version 1.0
 * @since 2018/1/25
 */
@Slf4j
public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

/*    在调用方法时，可能出现方法中抛出异常的情况。在异步中主要有有两种异常处理方法：
       1. 对于方法返回值是Futrue的异步方法: 不会被AsyncUncaughtExceptionHandler处理,
          a) 一种是在调用future的get时捕获异常; b) 在异常方法中直接捕获异常
       2. 对于返回值是void的异步方法：通过AsyncUncaughtExceptionHandler处理异常
       */


    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        log.error("错误信息:Async method has uncaught exception, params:{}" + Arrays.toString(params));

        if (ex instanceof AsyncException) {
            AsyncException asyncException = (AsyncException) ex;
            log.error("asyncException:"  + asyncException.getMessage());
        }

        log.error("错误信息:Exception :", ex);
    }
}
